/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.client.ordenproduccion;

import co.com.ces4.client.baseView.CreateBase;
import co.com.ces4.produccion.client.lineaproduccion.data.LineaProduccionDS;
import co.com.ces4.produccion.client.lineaproduccion.data.LineaProduccionRecord;
import co.com.ces4.produccion.client.modales.SolicitudProduccionModal;
import co.com.ces4.produccion.client.modales.interfaces.HasSolicitudModal;
import co.com.ces4.produccion.client.ordenproduccion.data.DetalleOrdenProduccionDS;
import co.com.ces4.produccion.client.ordenproduccion.data.DetalleOrdenProduccionRecord;
import co.com.ces4.produccion.client.solicitudproduccion.data.DetalleSolicitudDS;
import co.com.ces4.produccion.client.solicitudproduccion.data.DetalleSolicitudRecord;
import co.com.ces4.produccion.client.solicitudproduccion.data.SolicitudProduccionDS;
import co.com.ces4.produccion.client.solicitudproduccion.data.SolicitudProduccionRecord;
import co.com.ces4.produccion.jpa.entities.Articulo;
import co.com.ces4.produccion.jpa.entities.ArticuloLinea;
import co.com.ces4.produccion.jpa.entities.DetalleSolicitudProduccion;
import co.com.ces4.produccion.jpa.entities.LineaProduccion;
import co.com.ces4.produccion.jpa.entities.OrdenProduccion;
import co.com.ces4.produccion.jpa.entities.SolicitudProduccion;
import co.com.ces4.produccion.jpa.entities.Usuario;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.data.SortSpecifier;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.DateDisplayFormat;
import com.smartgwt.client.types.SelectionAppearance;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.types.SortDirection;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.Dialog;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.ButtonItem;
import com.smartgwt.client.widgets.form.fields.DateItem;
import com.smartgwt.client.widgets.form.fields.IntegerItem;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.SectionStackSection;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.tab.Tab;
import com.smartgwt.client.widgets.tab.TabSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;

/**
 *
 * @author Sebastian
 */
public class EdicionOrdenProduccion extends CreateBase implements HasSolicitudModal {

    private DateItem dtpFechaOrden;
    private TextItem txtNmOrden, txtIdentificacionUsuario, txtNombreUsuario, txtLoginUsuario, txtCodigoArticulo, txtDescripcionArticulo;
    private SelectItem cbxEstados, cbxLineasProduccion;
    private DynamicForm frmAdministracionOrden, frmSolicitudes, frmArticulos;
    private Button btnGuardar;
    private ButtonItem btnMostrar, btnEliminarSolicitud, btnAgregar, btnEliminarDetalle;
    private SectionStackSection stsAdministracionOrden;
    private HLayout hlyAccionesAdministracionOrden;
    private Usuario usuario;
    private SolicitudProduccion solicitudProduccion;
    private OrdenProduccion ordenProduccion;
    private Tab tabOrdenEncabezado;
    private Tab tabOrdenDetalle;
    private TabSet tabSet;
    private Label lblTituloSolicitudes, lblTituloDetallesOrden;
    private HLayout hlTituloSolicitudes, hlTituloDetallesOrden;
    private ListGrid solicitudesGrid;
    private VLayout vlContenedor, vlContenedorDetalles;
    private IntegerItem txtSolicitudProduccion, txtCantidadInicial, txtCantidadProducir;
    private ListGrid detallesSolicitudesGrid;
    private ListGrid detallesOrdenGrid;

    public EdicionOrdenProduccion(final Usuario usuario) {
        super("Orden de Produccion", "100%");
        this.usuario = usuario;

        stsAdministracionOrden = new SectionStackSection();
        stsAdministracionOrden.setShowHeader(false);
        stsAdministracionOrden.setCanCollapse(false);
        stsAdministracionOrden.setExpanded(true);

        frmAdministracionOrden = new DynamicForm();
        frmAdministracionOrden.setWidth100();
        frmAdministracionOrden.setNumCols(4);
        frmAdministracionOrden.setMargin(20);
        frmAdministracionOrden.setCellPadding(10);

        txtNmOrden = new TextItem("txtNmSolicitud", "Número de la Orden");
        txtNmOrden.setLength(11);
        txtNmOrden.setDisabled(true);

        txtIdentificacionUsuario = new TextItem("txtIdentificacionUsuario", "Identificación del Usuario");
        txtIdentificacionUsuario.setRequired(true);
        txtIdentificacionUsuario.setLength(20);
        txtIdentificacionUsuario.setValue(usuario.getDsid());
        txtIdentificacionUsuario.setDisabled(true);

        txtNombreUsuario = new TextItem("txtNombreUsuario", "Nombre de Usuario");
        txtNombreUsuario.setRequired(true);
        txtNombreUsuario.setLength(50);
        txtNombreUsuario.setValue(usuario.getDsnombre());
        txtNombreUsuario.setDisabled(true);


        txtLoginUsuario = new TextItem("txtLoginUsuario", "Login de Usuario");
        txtLoginUsuario.setRequired(true);
        txtLoginUsuario.setLength(150);
        txtLoginUsuario.setValue(usuario.getDsusuario());
        txtLoginUsuario.setDisabled(true);

        dtpFechaOrden = new DateItem("dtpFechaOrden", "Fecha de la Orden");
        dtpFechaOrden.setUseTextField(true);
        dtpFechaOrden.setRequired(true);
        Date fechaActual = new Date();
        dtpFechaOrden.setValue(fechaActual);
        dtpFechaOrden.setDisabled(true);
        dtpFechaOrden.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATE);

        cbxEstados = new SelectItem("cbxEstados", "Estado");
        cbxEstados.setEmptyPickListMessage("No hay registros para mostrar");
        cbxEstados.setEmptyDisplayValue("--- Seleccione ---");
        cbxEstados.setRequired(true);
        LinkedHashMap<String, String> opciones = new LinkedHashMap<String, String>();
        opciones.put("pendiente", "Pendiente");
        opciones.put("parcial", "Parcial");
        opciones.put("cancelada", "Cancelada");
        opciones.put("atendida", "Atendida");
        cbxEstados.setValueMap(opciones);

        tabSet = new TabSet();
        tabSet.setWidth100();
        tabSet.setHeight100();

        tabOrdenEncabezado = new Tab("Encbezado de la Orden de Producción");
        tabOrdenDetalle = new Tab("Detalle de la Orden de Producción");

        btnGuardar = new Button("Guardar");
        btnGuardar.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {
                //guardarOrdenProduccion();
            }
        });

        hlyAccionesAdministracionOrden = new HLayout();
        hlyAccionesAdministracionOrden.setMargin(15);
        hlyAccionesAdministracionOrden.setAlign(Alignment.CENTER);
        hlyAccionesAdministracionOrden.addMember(btnGuardar);
        hlyAccionesAdministracionOrden.setMembersMargin(15);
        setSectionContainerItems(hlyAccionesAdministracionOrden);

        frmAdministracionOrden.setItems(txtNmOrden, cbxEstados, txtIdentificacionUsuario, txtNombreUsuario, txtLoginUsuario, dtpFechaOrden);

        lblTituloSolicitudes = new Label("Solicitudes de Producción");
        lblTituloSolicitudes.setWidth100();
        lblTituloSolicitudes.setStyleName("tituloSolicitud");
        lblTituloSolicitudes.setAlign(Alignment.CENTER);

        hlTituloSolicitudes = new HLayout();
        hlTituloSolicitudes.setWidth100();
        hlTituloSolicitudes.setStyleName("fondoTituloSolicitud");
        hlTituloSolicitudes.setHeight("15px");
        hlTituloSolicitudes.setAlign(Alignment.CENTER);
        hlTituloSolicitudes.setMembers(lblTituloSolicitudes);

        frmSolicitudes = new DynamicForm();
        frmSolicitudes.setWidth100();
        frmSolicitudes.setHeight("25px");
        frmSolicitudes.setNumCols(4);

        btnMostrar = new ButtonItem("btnMostrar", "Seleccionar");
        btnMostrar.setColSpan(2);
        btnMostrar.setStartRow(true);
        btnMostrar.setEndRow(false);
        btnMostrar.setAlign(Alignment.RIGHT);
        btnMostrar.addClickHandler(new com.smartgwt.client.widgets.form.fields.events.ClickHandler() {

            public void onClick(com.smartgwt.client.widgets.form.fields.events.ClickEvent event) {
                SolicitudProduccionModal slm = new SolicitudProduccionModal(EdicionOrdenProduccion.this);
                slm.setIsModal(true);
                slm.centerInPage();
                slm.show();
            }
        });

        btnEliminarSolicitud = new ButtonItem("btnEliminar", "Eliminar");
        btnEliminarSolicitud.setColSpan(2);
        btnEliminarSolicitud.setStartRow(false);
        btnEliminarSolicitud.setEndRow(true);
        btnEliminarSolicitud.setAlign(Alignment.LEFT);

        frmSolicitudes.setItems(btnMostrar, btnEliminarSolicitud);

        solicitudesGrid = new ListGrid();
        solicitudesGrid.setWidth100();
        solicitudesGrid.setHeight100();
        solicitudesGrid.setFields(SolicitudProduccionRecord.getFields());
        solicitudesGrid.setEmptyMessage("No hay registros para mostrar");
        solicitudesGrid.setSelectionType(SelectionStyle.SIMPLE);
        solicitudesGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);
        solicitudesGrid.getField(SolicitudProduccionDS.IDSOLICITUD).setCanHide(true);
        solicitudesGrid.getField(SolicitudProduccionDS.IDSOLICITUD).setHidden(false);
        solicitudesGrid.getField(SolicitudProduccionDS.IDSOLICITUD).setCanFilter(true);
        solicitudesGrid.getField(SolicitudProduccionDS.ESTADO).setCanHide(false);
        solicitudesGrid.getField(SolicitudProduccionDS.ESTADO).setHidden(true);
        solicitudesGrid.getField(SolicitudProduccionDS.ESTADO).setCanFilter(false);
        solicitudesGrid.getField(SolicitudProduccionDS.CARGARSOLIPRO).setCanHide(false);
        solicitudesGrid.getField(SolicitudProduccionDS.CARGARSOLIPRO).setHidden(true);
        solicitudesGrid.getField(SolicitudProduccionDS.CARGARSOLIPRO).setCanFilter(false);
        solicitudesGrid.getField(SolicitudProduccionDS.FECHASOLICITUD).setWidth(140);
        SortSpecifier[] specifiers = new SortSpecifier[]{new SortSpecifier(SolicitudProduccionDS.FECHASOLICITUD, SortDirection.DESCENDING)};
        solicitudesGrid.setSort(specifiers);

        vlContenedor = new VLayout();
        vlContenedor.setHeight100();
        vlContenedor.setWidth100();
        vlContenedor.setMembersMargin(10);
        vlContenedor.setMembers(frmAdministracionOrden, hlTituloSolicitudes, frmSolicitudes, solicitudesGrid);

        tabOrdenEncabezado.setPane(vlContenedor);

        detallesSolicitudesGrid = new ListGrid();
        detallesSolicitudesGrid.setWidth100();
        detallesSolicitudesGrid.setHeight(215);
        detallesSolicitudesGrid.setDataSource(new DetalleSolicitudDS());
        detallesSolicitudesGrid.setAutoFetchData(true);
        detallesSolicitudesGrid.setFields(DetalleSolicitudRecord.getFields());
        detallesSolicitudesGrid.setEmptyMessage("No hay registros para mostrar");
        detallesSolicitudesGrid.setSelectionType(SelectionStyle.SIMPLE);
        detallesSolicitudesGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);
        detallesSolicitudesGrid.addRecordClickHandler(new RecordClickHandler() {

            public void onRecordClick(RecordClickEvent event) {
                Record solicitudDetalleRecord = event.getRecord();
                DetalleSolicitudProduccion solicitudDetalle = (DetalleSolicitudProduccion) solicitudDetalleRecord.getAttributeAsObject("detalleSolicitudProduccion");
                txtSolicitudProduccion.setValue(solicitudDetalle.getSolicitudProduccion().getNmid());
                txtCodigoArticulo.setValue(solicitudDetalle.getArticulo().getDsid());
                txtDescripcionArticulo.setValue(solicitudDetalle.getArticulo().getDsdescripcion());
                txtCantidadInicial.setValue(solicitudDetalle.getNmcantidad());
                cargarLineasProduccionXArticulo(solicitudDetalle.getArticulo());
            }
        });

        frmArticulos = new DynamicForm();
        frmArticulos.setWidth100();
        frmArticulos.setNumCols(4);

        txtCodigoArticulo = new TextItem("txtCodigoArticulo", "Código del Articulo");
        txtCodigoArticulo.setDisabled(true);
        txtCodigoArticulo.setLength(20);

        txtDescripcionArticulo = new TextItem("txtDescripcionArticulo", "Descripción del Articulo");
        txtDescripcionArticulo.setDisabled(true);
        txtDescripcionArticulo.setLength(50);

        txtSolicitudProduccion = new IntegerItem("txtSolicitudProduccion", "Solicitud de Producción");
        txtSolicitudProduccion.setDisabled(true);
        txtSolicitudProduccion.setLength(11);

        txtCantidadInicial = new IntegerItem("txtCantidadInicial", "Cantidad Inicial");
        txtCantidadInicial.setDisabled(true);
        txtCantidadInicial.setLength(11);

        txtCantidadProducir = new IntegerItem("txtCantidadProducir", "Cantidad a Producir");
        txtCantidadProducir.setLength(11);

        cbxLineasProduccion = new SelectItem("cbxEstados", "Líneas de Producción");
        cbxLineasProduccion.setEmptyPickListMessage("No hay registros para mostrar");
        cbxLineasProduccion.setEmptyDisplayValue("--- Seleccione ---");
        cbxLineasProduccion.setValueField(LineaProduccionDS.CODIGOLINEA);
        cbxLineasProduccion.setDisplayField(LineaProduccionDS.DESCRIPCION);
        
        btnAgregar = new ButtonItem("btnAgregar", "Agregar Detalle");
        btnAgregar.setColSpan(2);
        btnAgregar.setStartRow(true);
        btnAgregar.setEndRow(false);
        btnAgregar.setAlign(Alignment.RIGHT);
        btnAgregar.addClickHandler(new com.smartgwt.client.widgets.form.fields.events.ClickHandler() {

            public void onClick(com.smartgwt.client.widgets.form.fields.events.ClickEvent event) {
                
            }
        });

        btnEliminarDetalle= new ButtonItem("btnEliminarDetalle", "Eliminar Detalle");
        btnEliminarDetalle.setColSpan(2);
        btnEliminarDetalle.setStartRow(false);
        btnEliminarDetalle.setEndRow(true);
        btnEliminarDetalle.setAlign(Alignment.LEFT);
        
        lblTituloDetallesOrden = new Label("Detalles de la Orden de Producción");
        lblTituloDetallesOrden.setWidth100();
        lblTituloDetallesOrden.setStyleName("tituloSolicitud");
        lblTituloDetallesOrden.setAlign(Alignment.CENTER);

        hlTituloDetallesOrden = new HLayout();
        hlTituloDetallesOrden.setWidth100();
        hlTituloDetallesOrden.setStyleName("fondoTituloSolicitud");
        hlTituloDetallesOrden.setHeight("15px");
        hlTituloDetallesOrden.setAlign(Alignment.CENTER);
        hlTituloDetallesOrden.setMembers(lblTituloDetallesOrden);

        detallesOrdenGrid = new ListGrid();
        detallesOrdenGrid.setWidth100();
        detallesOrdenGrid.setHeight(240);
        detallesOrdenGrid.setDataSource(new DetalleOrdenProduccionDS());
        detallesOrdenGrid.setAutoFetchData(true);
        detallesOrdenGrid.setFields(DetalleOrdenProduccionRecord.getFields());
        detallesOrdenGrid.getField(DetalleOrdenProduccionDS.CODIGOORDEN).setCanHide(false);
        detallesOrdenGrid.getField(DetalleOrdenProduccionDS.CODIGOORDEN).setHidden(true);
        detallesOrdenGrid.getField(DetalleOrdenProduccionDS.CODIGOORDEN).setCanFilter(false);
        detallesOrdenGrid.setEmptyMessage("No hay registros para mostrar");
        detallesOrdenGrid.setSelectionType(SelectionStyle.SIMPLE);
        detallesOrdenGrid.setSelectionAppearance(SelectionAppearance.CHECKBOX);

        vlContenedorDetalles = new VLayout();
        vlContenedorDetalles.setHeight100();
        vlContenedorDetalles.setWidth100();
        vlContenedorDetalles.setMembersMargin(10);

        frmArticulos.setItems(txtSolicitudProduccion, txtCodigoArticulo, txtDescripcionArticulo, txtCantidadInicial, txtCantidadProducir, cbxLineasProduccion, btnAgregar, btnEliminarDetalle);

        vlContenedorDetalles.setMembers(detallesSolicitudesGrid, frmArticulos, hlTituloDetallesOrden, detallesOrdenGrid);

        tabOrdenDetalle.setPane(vlContenedorDetalles);

        tabSet.setTabs(tabOrdenEncabezado, tabOrdenDetalle);

        stsAdministracionOrden.addItem(tabSet);

        addSection(stsAdministracionOrden);
    }

    public void modalSolicitud(SolicitudProduccion selection) {
        if (selection != null) {
            solicitudProduccion = selection;
            ListGridRecord[] records = solicitudesGrid.getRecords();
            Boolean existe = false;

            if (records.length > 0) {
                for (int i = 0; i < records.length; i++) {
                    if (records[i].getAttributeAsString(SolicitudProduccionDS.IDSOLICITUD).equals(solicitudProduccion.getNmid().toString())) {
                        existe = true;
                        break;
                    }
                }
            }

            if (!existe) {
                solicitudesGrid.addData(new SolicitudProduccionRecord(solicitudProduccion));

                List<DetalleSolicitudProduccion> detalles = new ArrayList<DetalleSolicitudProduccion>();
                detalles = solicitudProduccion.getDetalleSolicitudProduccionList();
                for (int j = 0; j < detalles.size(); j++) {
                    detallesSolicitudesGrid.addData(new DetalleSolicitudRecord(detalles.get(j)));
                }
            } else {
                SC.warn("Advertencia", "Señor usuario, la solicitud de producción ya esta asociada a la orden", new BooleanCallback() {

                    @Override
                    public void execute(Boolean value) {
                    }
                }, new Dialog());
                existe = true;
                return;
            }
        }
    }

    private void cargarLineasProduccionXArticulo(Articulo articulo) {
        LineaProduccionDS lineaProduccionDS = new LineaProduccionDS();
        List<LineaProduccion> lineas = new ArrayList<LineaProduccion>();
        for (ArticuloLinea articuloLinea : articulo.getArticuloLineaList()) {
            lineas.add(articuloLinea.getLineaProduccion());
        }

        for (int i = 0; i < lineas.size(); i++) {
            lineaProduccionDS.addData(new LineaProduccionRecord(lineas.get(i)));
        }
        cbxLineasProduccion.setOptionDataSource(lineaProduccionDS);
    }
}
